package mdbs;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import model.Cliente;
import model.ItemCotizacion;
import model.ItemVenta;
import sessionbeans.AdministradorCotizaciones;
import sessionbeans.AdministradorOperaciones;
import util.jms.JMSHelper;
import xml.model.ItemPedidoVentaXML;
import xml.model.ItemXML;
import xml.model.PedidoVentaXML;
import xml.model.SolicitudCotizacionXML;
import xml.model.SolicitudVentaXML;

import com.thoughtworks.xstream.XStream;


@MessageDriven(activationConfig = {
		@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
		@ActivationConfigProperty(propertyName="destination", propertyValue="queue/pedidosQueue")
})
public class GenerarOrdenCompraMDB implements MessageListener {
	
	final String PEDIDOS_VENTA_QUEUE = "queue/ordenesDeCompraOfV5Queue";
	final String COTIZACION_CLIENTE_QUEUE = "queue/cotizacionesQueue";
	String ipPortCliente = "jnp://172.16.171.13:1099";
	String ipPortCC = "jnp://172.16.171.43:1099";
	
	@PersistenceContext(unitName = "OficinaVentasPU")
    private EntityManager em;
	
	@EJB
	private AdministradorCotizaciones administradorCotizaciones;
	
	@EJB
	private AdministradorOperaciones administradorOperaciones;
	
    public GenerarOrdenCompraMDB() {}
	
	/**
     * @see MessageListener#onMessage(Message)
     */
    public void onMessage(Message message) {
    	try {
			TextMessage mensaje = (TextMessage) message;
			String xml = mensaje.getText();
			System.out.println("GenerarOrdenCompraMDB: recibido el mensaje");
			XStream xstream = new XStream();
			xstream.alias("SolicitudVenta", SolicitudVentaXML.class);
			xstream.autodetectAnnotations(true);
			SolicitudVentaXML solicitudVentaXML = (SolicitudVentaXML) xstream.fromXML(xml);
			System.out.println("Id Cliente: " + solicitudVentaXML.getCliente().getId() + 
			"\nItems de la solicitud: ");
			for(ItemXML i : solicitudVentaXML.getListaItemSolVenta()){
				System.out.println(i.getCaracteristicas());
			}
			Integer idCliente = solicitudVentaXML.getCliente().getId();
			Cliente cliente = em.find(Cliente.class, idCliente);
			System.out.println(cliente.getApellido());
			
			List<ItemPedidoVentaXML> listaItemPedidoVenta = new ArrayList<ItemPedidoVentaXML>();
			List<ItemXML> listaItemSolCot = new ArrayList<ItemXML>();
			
			List<ItemCotizacion> itemsCotizacionVigentes 
				= administradorCotizaciones.obtenerItemsCotizacionesVigentesDeClientePorId(idCliente);
			/*cantidad que me queda por venderle o generar cotizacion*/
			Integer cantidadAVender=0;
		
			/*cantidad vendida de un itemcotizacion en ventas anteriores*/
			Integer cantidadVendida=0;
		 	for(ItemXML itemXML : solicitudVentaXML.getListaItemSolVenta()){
				/*Para cada item, veo si esta en la lista de items vigentes del cliente*/
		 		

				/*cantidad que le tengo que vender....de esta voy restando lo que le voy vendiendo de distintas cotizaciones y si al final de recorrer
				 * todas las cotizaciones no esta en 0 es pq todavia tengo que cotizarle algo*/
		 		cantidadAVender = itemXML.getCantidad();
				
				for(Iterator<ItemCotizacion> itemCotIterator = itemsCotizacionVigentes.iterator()
						; itemCotIterator.hasNext();){
					ItemCotizacion itemCot = itemCotIterator.next();
					
					cantidadVendida=0;
					/*verificosi el item cotizado es igual al item que necesito y si todavia me falta venderle unidades*/
					if(itemXML.esIgualAItemCotizacion(itemCot) &&cantidadAVender !=0 ){
						
						
						/*si la cantidad a vender del item cotizado es mayor a 0 vendo lo pedido o lo maximo que pueda*/
						
						
						for(ItemVenta itemVenta:itemCot.getItemsVentas()){
							cantidadVendida +=itemVenta.getCantidadVendida();

							System.out.println("CANTIDAD vendida: " + cantidadVendida + " item:"+itemCot.getId());
						}
						/*verifico si puedo venderle algo de ese item, le vendo todo lo que pidio o para lo que me alcance*/
						if((itemCot.getCantidad()-cantidadVendida)!=0){
							ItemPedidoVentaXML itemPedidoVenta = new ItemPedidoVentaXML();
							/*si la cantidad que me piden o que me queda por venderle es menor o igual a la que puedo vender le vendo todo lo que me pide*/
							if(cantidadAVender<=(itemCot.getCantidad()-cantidadVendida)){	
							itemPedidoVenta.setCantidad(cantidadAVender);
							/*si le vendi todo pongo que me queda 0 por venderle*/
							cantidadAVender=0;
							}else{
							/*si la cantidad por vender es mayor a la disponible le vendo la disponible*/
								itemPedidoVenta.setCantidad(itemCot.getCantidad()-cantidadVendida);
								//actualizo lo que me queda por venderle restando lo que ya le vendi
								cantidadAVender-=itemPedidoVenta.getCantidad();
							
							}
							itemPedidoVenta.setCaracteristicas(itemXML.getCaracteristicas());
							itemPedidoVenta.setCodigo(itemXML.getCodigo());
							itemPedidoVenta.setIdlistaprecios(itemCot.getIdlistaprecios());
							itemPedidoVenta.setMarca(itemXML.getMarca());
							itemPedidoVenta.setOrigen(itemXML.getOrigen());
							itemPedidoVenta.setIdcotizacion(itemCot.getCotizacion().getId());
							listaItemPedidoVenta.add(itemPedidoVenta);
						}
					
					}
				}
					/*cuando termine de recorrer toda la lista de items de cotizaciones, verifico si todavia me faltan unidades por venderle
					 * si me faltan unidades le genero una cotizacion por estas
					 */
						
					if(cantidadAVender!=0){
						itemXML.setCantidad(cantidadAVender);
						listaItemSolCot.add(itemXML);
					
					}
				
		 	}
			
		 	
			if(!listaItemPedidoVenta.isEmpty()){				
				PedidoVentaXML pedidoVentaXML = new PedidoVentaXML(listaItemPedidoVenta);
				pedidoVentaXML.setCliente(solicitudVentaXML.getCliente());
				XStream xstreamPedidoVenta = new XStream();
				xstreamPedidoVenta.alias("PedidoVenta", PedidoVentaXML.class);
				xstreamPedidoVenta.autodetectAnnotations(true);
				String xmlPedidoVenta = xstreamPedidoVenta.toXML(pedidoVentaXML);
				System.out.println("\nPedido de Venta: \n" + xmlPedidoVenta);
				
				JMSHelper.sendMessage(xmlPedidoVenta, PEDIDOS_VENTA_QUEUE, ipPortCC);
			}
			
			if(!listaItemSolCot.isEmpty()){
				
				SolicitudCotizacionXML solicitudCotizacionXML = new SolicitudCotizacionXML(solicitudVentaXML.getCliente(), listaItemSolCot);
				
				XStream xstreamSolCot = new XStream();
				xstreamSolCot.alias("SolicitudCotizacion", SolicitudCotizacionXML.class);
				xstreamSolCot.autodetectAnnotations(true);
				
				String xmlSolCot = xstreamSolCot.toXML(solicitudCotizacionXML);
				System.out.println("Solicitud de Cotizacion: \n" + xmlSolCot);
				
				String respuestaCotizacionXML = administradorOperaciones.solicitarCotizacion(xmlSolCot);
				
				System.out.println("\n\nItems pendientes de cotizacion: \n" + respuestaCotizacionXML);
				
				JMSHelper.sendMessage(respuestaCotizacionXML, COTIZACION_CLIENTE_QUEUE, ipPortCliente);
			}
			
		} catch (JMSException jmse) {
			System.out.println("Error al procesar el mensaje: " + jmse);
		}
    }
}
